package br.com.webprojeto.fachada;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.webprojeto.basicas.*;
import br.com.webprojeto.cadastro.*;
import br.com.webprojeto.cadastro.interfaces.*;
import br.com.webprojeto.colecoes.*;
import br.com.webprojeto.exception.CnpjDuplicadoException;
import br.com.webprojeto.exception.CpfDuplicadoException;

@ManagedBean
@ViewScoped
public class Fachada {

	

	// atributos da interface do cadastro
	private InterfaceCadastroColetaMercadoria coleta;
	private InterfaceCadastroEmpresa empresa;
	private InterfaceCadastroEntrega entrega;
	private InterfaceCadastroFuncionario funcionario;
	private InterfaceCadastroNotaFiscal notaFiscal;
	private InterfaceCadastroRota rota;
	private InterfaceCadastroTrecho trecho;
	private InterfaceCadastroVeiculos veiculos;
	private InterfaceCadastroFisica fisicas;
	private InterfaceCadastroJuridica juridicas;
	private InterfaceCadastroCliente clientes;

	// construtores
	public Fachada() {
		super();
		coleta = new CadastroColetaMercadoria(new ColecaoColetaMercadoria());
		empresa = new CadastroEmpresa(new ColecaoEmpresa());
		entrega = new CadastroEntrega(new ColecaoEntrega());
		funcionario = new CadastroFuncionario(new ColecaoFuncionario());
		notaFiscal = new CadastroNotaFiscal(new ColecaoNotaFiscal());
		rota = new CadastroRota(new ColecaoRota());
		trecho = new CadastroTrecho(new ColecaoTrecho());
		veiculos = new CadastroVeiculos(new ColecaoVeiculo());
		fisicas = new CadastroFisica(new ColecaoFisica());
		juridicas = new CadastroJuridica(new ColecaoJuridica());
		clientes = new CadastroCliente(new ColecaoCliente());
	}

	// metodos instanciados
	private static Fachada instancia;

	public static Fachada getInstancia() {
		if (instancia == null) {
			instancia = new Fachada();
		}
		return instancia;
	}

	// Metodos delegados
	public void adicionarColeta(ColetaMercadoria col) {
		coleta.adicionarColeta(col);
	}

	public void atualizarColeta(ColetaMercadoria col) {
		coleta.atualizarColeta(col);
	}

	public List<ColetaMercadoria> localizarColetaStatus(String status) {
		return coleta.localizarColetaStatus(status);
	}

	public void adicionarCliente(Cliente P) {
		clientes.adicionarCliente(P);
	}

	public Cliente localizarCliente(String cpfCnpj) {
		return clientes.localizarCliente(cpfCnpj);
	}

	public void removerCliente(long codCliente) {
		clientes.removerCliente(codCliente);
	}

	public void atualizarCliente(Cliente P) {
		clientes.atualizarCliente(P);
	}

	public Cliente procurarCliente(long codCliente) {
		return clientes.procurarCliente(codCliente);
	}

	public List<Cliente> listarCliente() {
		return clientes.listarCliente();
	}

	public void removerColeta(long codColeta) {
		coleta.removerColeta(codColeta);
	}

	public List<ColetaMercadoria> listarColeta() {
		return coleta.listarColeta();
	}

	public ColetaMercadoria procurarColeta(long codColeta) {
		return coleta.procurarColeta(codColeta);
	}

	public void adicionarEmpresa(Empresa Emp) throws CnpjDuplicadoException {
		empresa.adicionarEmpresa(Emp);
	}

	public Empresa localizarEmpresaStatus(String status) {
		return empresa.localizarEmpresaStatus(status);
	}

	public void removerEmpresa(long codEmpresa) {
		empresa.removerEmpresa(codEmpresa);
	}

	public void atualizarEmpresa(Empresa Emp) {
		empresa.atualizarEmpresa(Emp);
	}

	public Empresa procurarEmpresa(String cnpj) {
		return empresa.procurarEmpresa(cnpj);
	}

	public List<Empresa> listarEmpresa() {
		return empresa.listarEmpresa();
	}

	public void adicionarEntrega(Entrega Ent) {
		entrega.adicionarEntrega(Ent);
	}

	public void atualizarEntrega(Entrega Ent) {
		entrega.atualizarEntrega(Ent);
	}

	public List<Entrega> listarEntrega() {
		return entrega.listarEntrega();
	}

	public Entrega procurarEntrega(long codNotaFiscal) {
		return entrega.procurarEntrega(codNotaFiscal);
	}

	public void adicionarFuncionario(Funcionario Fu)
			throws CpfDuplicadoException {
		funcionario.adicionarFuncionario(Fu);
	}

	public void removerFuncionario(Funcionario Fu) {
		funcionario.removerFuncionario(Fu);
	}

	public void atualizarFuncionario(Funcionario Fu) {
		funcionario.atualizarFuncionario(Fu);
	}

	public List<Funcionario> listarFuncionario() {
		return funcionario.listarFuncionario();
	}

	public Funcionario procurarFuncionarioCpf(String cpf) {
		return funcionario.procurarFuncionarioCpf(cpf);
	}

	public void adicionarNotaFiscal(NotaFiscal Nf) {
		notaFiscal.adicionarNotaFiscal(Nf);
	}

	public List<NotaFiscal> listarNotaFiscal() {
		return notaFiscal.listarNotaFiscal();
	}

	public NotaFiscal procurarNotaFiscal(long codNotafiscal) {
		return notaFiscal.procurarNotaFiscal(codNotafiscal);
	}

	public void atualiazarNotaFiscal(NotaFiscal Nf) {
		notaFiscal.atualiazarNotaFiscal(Nf);
	}

	public void adicionarRota(Rota Rt) {
		rota.adicionarRota(Rt);
	}

	public void removerRota(Rota Rt) {
		rota.removerRota(Rt);
	}

	public void atualizarRota(Rota Rt) {
		rota.atualizarRota(Rt);
	}

	public List<Rota> listarRota() {
		return rota.listarRota();
	}

	public Rota procurarRota(String destino) {
		return rota.procurarRota(destino);
	}

	public void adicionarTrecho(Trecho Tr) {
		trecho.adicionarTrecho(Tr);
	}

	public void removerTrecho(Trecho Tr) {
		trecho.removerTrecho(Tr);
	}

	public List<Trecho> listarTrecho() {
		return trecho.listarTrecho();
	}

	public Trecho procurarTrecho(long codTrecho) {
		return trecho.procurarTrecho(codTrecho);
	}
	
	public void atualizarTrecho(Trecho Tr) {
		trecho.atualizarTrecho(Tr);
	}

	public void adicionarVeiculo(Veiculo Ve) {
		veiculos.adicionarVeiculo(Ve);
	}

	public void removerVeiculo(Veiculo Ve) {
		veiculos.removerVeiculo(Ve);
	}

	public void atualizarVeiculo(Veiculo Ve) {
		veiculos.atualizarVeiculo(Ve);
	}

	public Veiculo procurarVeiculo(String placaPolicial) {
		return veiculos.procurarVeiculo(placaPolicial);
	}

	public List<Veiculo> listarVeiculo() {
		return veiculos.listarVeiculo();
	}

	public boolean equals(Object arg0) {
		return instancia.equals(arg0);
	}

	public int hashCode() {
		return instancia.hashCode();
	}

	public String toString() {
		return instancia.toString();
	}

	public InterfaceCadastroFuncionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(InterfaceCadastroFuncionario funcionario) {
		this.funcionario = funcionario;
	}

	public void adicionarFisica(Fisica f) throws CpfDuplicadoException {
		fisicas.adicionarFisica(f);
	}

	public void removerFisica(long codFisica) {
		fisicas.removerFisica(codFisica);
	}

	public void atualizarFisica(Fisica fis) {
		fisicas.atualizarFisica(fis);
	}

	public List<Fisica> listarFisica() {
		return fisicas.listarFisica();
	}

	public Fisica procurarFisica(long codFisica) {
		return fisicas.procurarFisica(codFisica);
	}

	public Fisica localizarFisicaCpf(String cpf) {
		return fisicas.localizarFisicaCpf(cpf);
	}

	public void adicionarJuridica(Juridica jud) throws CnpjDuplicadoException {
		juridicas.adicionarJuridica(jud);
	}

	public void removerJuridica(long codJuridica) {
		juridicas.removerJuridica(codJuridica);
	}

	public void atualizarJuridica(Juridica jud) {
		juridicas.atualizarJuridica(jud);
	}

	public List<Juridica> listarJuridica() {
		return juridicas.listarJuridica();
	}

	public Juridica procurarJuridica(long codJuridica) {
		return juridicas.procurarJuridica(codJuridica);
	}

	public Juridica localizarJuridicaCnpj(String cnpj) {
		return juridicas.localizarJuridicaCnpj(cnpj);
	}

}
